import json
import re

from django.shortcuts import render

# Create your views here.

"""
判断用户名是否重复的功能实现

前端：当用户输入用户名，失去焦点之后，发送一个axios(ajax)请求

后端：
    请求：接收用户名
    业务逻辑：根据用户名查询数据库。如果查询结果数量等于0，说明没有注册；否则，说明已经注册
    响应：JSON数据 {code:0, count:0/1, errmsg:ok}

    路由：GET usernames/<username>/count/

"""
from django.views import View
from apps.users.models import User
from django.http import JsonResponse


class UsernameCountView(View):

    def get(self, request, username):
        # 1. 接收用户名
        # 2.根据用户名查询数据库
        count = User.objects.filter(username=username).count()
        # 3.返回响应
        return JsonResponse({'code': 0, 'count': count, 'errmsg': 'ok'})


"""
对前端提交的任何数据都要进行验证！！！
前端：当用户输入 用户名，密码，确认密码，手机号，同意协议，并且点击注册按钮之后
     发送axios请求
后端：
    请求：接收POST请求(JSON)。获取数据
    业务逻辑：验证数据。数据入库
    响应：JSON {'code':0, 'errmsg':'ok'}
    
    路由：POST register/
"""


class RegisterView(View):

    def post(self, request):
        # 1.接收请求
        body_bytes = request.body
        body_str = body_bytes.decode()
        body_dict = json.loads(body_str)
        # 2. 获取数据
        username = body_dict.get('username')
        password = body_dict.get('password')
        password2 = body_dict.get('password2')
        mobile = body_dict.get('mobile')
        allow = body_dict.get('allow')
        # 3.验证数据
        #   3.1用户名，密码，确认密码，手机号，同意协议 是否都有
        # all([]) 里的元素，只要有None/False，就返回False
        if not all([username, password, password2, mobile, allow]):
            return JsonResponse({'code': 400, 'errmsg': '参数不全'})
        #   3.2用户名是否满足规则，用户名不能重复
        if not re.match('[a-zA-Z0-9_-]{5,20}', username):
            return JsonResponse({'code': 400, 'errmsg': '用户名不满足规则'})
        #   3.3密码是否满足规则
        #   3.4确认密码和密码是否一致
        #   3.5手机号是否满足规则，手机号不能重复
        #   3.6是否同意协议
        # 4.数据入库
        # user=User(username=username,password=password,moble=mobile)
        # user.save()

        # User.objects.create(username=username, password=password, mobile=mobile)
        # 以上两种方式，都可以使数据入库，但是密码没有加密
        user = User.objects.create_user(username=username, password=password, mobile=mobile)

        # 如何设置Session信息
        # request.session['user_id'] = user.id
        # django为我们提供了 状态保持的方法
        from django.contrib.auth import login
        login(request, user)
        # 5.返回响应
        return JsonResponse({'code': 0, 'errmsg': 'ok'})


"""
如果需求是注册成功后即表示用户认证通过，那么此时可以在注册成功后实现状态保持（注册成功即登录）
如果需求是注册成功后不表示用户认证通过，那么此时不用在注册成功后实现状态保持（注册成功用户自行登录）

实现状态保持的两种方法：
    在客户端存储信息使用Cookie
    在服务端存储信息使用Session

"""